const express = require('express')
const bodyParser = require('body-parser')
const cors = require('cors')
const expressJwt = require('express-jwt')
const app = express()

const http = require("http");
const socketIo = require("socket.io");
const fs = require("fs");

const server = http.createServer(app);
// 配置 Socket.IO 允许跨域
const io = socketIo(server, {
    cors: {
        origin: "http://127.0.0.1:8080", // 替换为你的前端地址
        methods: ["GET", "POST"],
        credentials: true,
    },
});
// 处理Socket.IO连接
io.on("connection", (socket) => {
    // totalLogins++;
    // 广播在线人数和累计登录人数
    io.emit("updateOnlineCount", onlineUsers);
    io.emit("updateTotalCount", totalLogins);
    console.log(`用户连接：当前在线人数 ${onlineUsers}`);
    // 处理断开连接
    socket.on("disconnect", () => {
        onlineUsers = Math.max(onlineUsers - 1, 0); // 确保在线人数非负
        io.emit("updateOnlineCount", onlineUsers);
        console.log(`用户断开：当前在线人数 ${onlineUsers}`);
    });
    // 登录事件（可扩展）
    socket.on("userLogin", () => {
        totalLogins++;
        onlineUsers++;
        // 广播在线人数和累计登录人数
        io.emit("updateOnlineCount", onlineUsers);
        io.emit("updateTotalCount", totalLogins);
        // 保存累计人数数据到本地
        fs.writeFileSync(DATA_FILE, JSON.stringify({ totalLogins }));
        console.log("新用户登录");
    });
});


app.use(cors())
app.use(express.urlencoded({ extended: false }))
// bodyParser一定要在路由注册前注册
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
//验证token是否过期并规定哪些路由不需要验证
app.use(expressJwt({
    secret:'kiorry',
    algorithms:['HS256']
}).unless({
    path: [
        /^\/socket\.io\/.*/, // 匹配 WebSocket 请求路径
        /^\/login$/,  // 精确匹配 /login
        /^\/adminLogin$/,  // 精确匹配 /adminLogin
        /^\/static\/.*$/, // 匹配所有以 /static/ 开头的路径
        /^\/teacher\/.*$/,
        /^\/admin\/.*$/,
    ]
}))

let onlineUsers = 0; // 当前在线人数
let totalLogins = 0; // 累计登录人数
// 读取累计人数数据（如果存在）
const DATA_FILE = "totalLogins.json";
if (fs.existsSync(DATA_FILE)) {
    const data = fs.readFileSync(DATA_FILE);
    totalLogins = JSON.parse(data).totalLogins || 0;
}

//  public 目录下的图片、CSS 文件、JavaScript 文件对外开放访问
app.use('/static', express.static('public'))

app.use((req, res, next) => {
    res.setHeader('Content-Type', 'text/html; charset=utf-8');  // 设置字符编码
    next();
});

// 导入并注册全局路由模块
const routes = require('./router/index')
app.use('/', routes)
// token错误中间件
app.use((err, req, res, next) => {
    console.log(err);
    if (err.name === 'UnauthorizedError') {
        return  res.json({
            status: 401,
            message: '身份认证失败！'
        })
    }else {
        return  res.json({
            status: 500,
            message: '未知的错误'
        })
    }
});
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('服务器内部错误');
});

// 统一启动 HTTP 和 WebSocket 服务
const PORT = 3000;
server.listen(PORT, () => {
    console.log(`服务已启动：http://127.0.0.1:${PORT}`);
});
